/*
 * $Id: CategoryJsonServlet.java 32 2012-01-25 14:33:53Z rook.alex@gmail.com $
 */
package ua.org.energy.vkek.site.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import ua.org.energy.vkek.site.model.ArticleCategory;
import ua.org.energy.vkek.site.server.CategoryUtils;
import ua.org.energy.vkek.site.server.DataIOException;
import ua.org.energy.vkek.site.server.EMF;

//TODO: возращать локализованный текст ошибок
public class CategoryJsonServlet extends BaseJsonServlet {

    
    @Override
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/javascript;charset=UTF-8");
        //    throw new ServletException("test exception");
        ArticleCategory category;

        PrintWriter out = response.getWriter();

        String action = request.getParameter("action");
        if (checkParamValue(action)) {
            if (action.equalsIgnoreCase("ins")) {
                category = insert(request.getParameter("newcategory"));
                printOk("insert", category, out);
            } else if (action.equalsIgnoreCase("upd")) {
                category = update(request.getParameter("newcategory"), request.getParameter("selcategory"));
                printOk("update", category, out);
            } else if (action.equalsIgnoreCase("del")) {
                delete(request.getParameter("selcategory"));//удаляем выбранную
                printOk("delete", null, out);
            } else {
                throw new ServletException("an unknown action");
            }
        } else {
            printCategoryList(out);
        }
        out.close();
    }

    /**
     * выводит в out - JSON объект - результат uid-операции над ArticleCategory
     *
     * @param operation - тип операции - одна из строк 'insert', 'update',
     * 'delete'
     * @param ArticleCategory - категория - результат операции
     * вставки/обновления/для удаления(null)
     * @param out вывод для JSON
     */
    private void printOk(String operation, ArticleCategory category, PrintWriter out) {
        EntityUIDJson<ArticleCategory> uidjson = new EntityUIDJson<ArticleCategory>(operation, category);
        printOk(uidjson, out);

    }

    private void printCategoryList(PrintWriter out) {
        List<ArticleCategory> list = getListAll();
        printEntList(list, out);
    }

    private List<ArticleCategory> getListAll() {
        CategoryUtils utils = new CategoryUtils(EMF.getEM());
        return utils.listAll();
    }

    /*
     * для UID операций транзакцию открывает EMFFilter
     */
    private ArticleCategory insert(String newcategoryName) throws DataIOException {
        if (checkParamValue(newcategoryName)) {
            CategoryUtils utils = new CategoryUtils(EMF.getEM());
            ArticleCategory result = utils.insert(newcategoryName);
            EMF.safeCommit(EMF.getEM()); //без коммита не создается Key и не передается в response json 
            return result;
        } else {
            throw new DataIOException("category name could not be empty");
        }

    }

    private ArticleCategory update(String newcategoryName, String oldcategoryName) throws DataIOException {
        if (checkParamValue(newcategoryName)
                && checkParamValue(oldcategoryName)) {
            CategoryUtils utils = new CategoryUtils(EMF.getEM());
            ArticleCategory result = utils.update(oldcategoryName, newcategoryName);
            EMF.safeCommit(EMF.getEM()); //без коммита не создается Key и не передается в response json 
            return result;
        } else {
            throw new DataIOException("empty ArticleCategory name  while update");
        }
    }

    private void delete(String delcategoryName) throws DataIOException {
        if (checkParamValue(delcategoryName)) {
            CategoryUtils utils = new CategoryUtils(EMF.getEM());
            utils.delete(delcategoryName);
            EMF.safeCommit(EMF.getEM());
        } else {
            throw new DataIOException("empty category name  while delete");
        }

    }
}
